
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;


/**
 * @author Lucas
 */
public class Cliente {
    
    private String musica;
    private static Integer portaServidor = 7000;
    private static String ipServidor = "192.168.1.7";
    private Socket socketEnvio;
    private static Integer tamanhoBuffer = 20 * 1024;
    
    public Cliente(String nomeMusica) {
        musica = nomeMusica;
    }    
    
    public Boolean search() {
        try {
            System.out.println("Solicitando música " + getMusica() + " para o provedor do serviço...");
            DataInputStream in = new DataInputStream(socketEnvio.getInputStream());
            DataOutputStream out = new DataOutputStream(socketEnvio.getOutputStream());
            out.writeUTF(getMusica());
            if (in.readBoolean()) {
                System.out.println("Música com o nome " + getMusica() + " encontrada.");
                return true;
            }
        } catch (Exception e) { /**/ }
        System.err.println("Música com o nome " + getMusica() + " não encontrada.");
        return false;
    }
    
    public void deliver() throws FileNotFoundException, IOException {
        int filesize=6022386;  
        int bytesLidos;  
        int tamanhoAtual = 0;   

        // recebendo o arquivo  
        byte [] mybytearray  = new byte [filesize];  
        InputStream is = socketEnvio.getInputStream();  
        FileOutputStream fos = new FileOutputStream(getMusica() + ".mp3");  
        BufferedOutputStream bos = new BufferedOutputStream(fos);  
        bytesLidos = is.read(mybytearray,0,mybytearray.length);  
        tamanhoAtual = bytesLidos;  

        do {  
           bytesLidos =  is.read(mybytearray, tamanhoAtual, (mybytearray.length-tamanhoAtual));  
           if(bytesLidos >= 0) tamanhoAtual += bytesLidos;  
        } while(bytesLidos > -1);  

        bos.write(mybytearray, 0 , tamanhoAtual);
        bos.close();  
        socketEnvio.close(); 
    }
    
    public Boolean conectar() {
        try {
            InetAddress ip = InetAddress.getByName(getIpServidor());
            socketEnvio = new Socket(ip, getPortaServidor());
        } catch (SocketException se) {
            System.err.println("Erro no socket: " + se.getMessage());
        } catch (IOException e) {
            System.err.println("Erro de IO: " + e.getMessage());
            return false;
        } catch (Exception ex) {
            System.err.println("Erro " + ex);
            return false;
        }
        return true;
    }

    public String getMusica() {
        return musica;
    }

    public void setMusica(String musica) {
        this.musica = musica;
    }

    public static Integer getPortaServidor() {
        return portaServidor;
    }

    public static void setPortaServidor(Integer portaServidor) {
        Cliente.portaServidor = portaServidor;
    }

    public static String getIpServidor() {
        return ipServidor;
    }

    public static void setIpServidor(String ipServidor) {
        Cliente.ipServidor = ipServidor;
    }

    public Socket getSocketEnvio() {
        return socketEnvio;
    }

    public void setSocketEnvio(Socket socketEnvio) {
        this.socketEnvio = socketEnvio;
    }

    
    
}
